Add a flags argument to gtk_widget_pick
authorMatthias Clasen <mclasen@redhat.com>
Sun, 7 Apr 2019 17:19:09 +0000 (17:19 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 7 Apr 2019 17:19:09 +0000 (17:19 +0000)
This will be used to let the inspector and other users
pick insensitive widgets again. For now, update all
callers to pass no flags, preserving the current
behavior.

14 files changed:
demos/gtk-demo/dnd.c
demos/gtk-demo/sliding_puzzle.c
gtk/gtkenums.h
gtk/gtkflowbox.c
gtk/gtkmain.c
gtk/gtkpointerfocus.c
gtk/gtkrange.c
gtk/gtktooltip.c
gtk/gtkwidget.c
gtk/gtkwidget.h
gtk/gtkwindow.c
gtk/gtkwindowprivate.h
gtk/inspector/inspect-button.c
tests/testwidgettransforms.c

index cb21d2f25b047bcffd79264c1623e0eaeef74870..7ee7591e74fc755c68f1f502c263a2eee45b1aef 100644 (file)
@@ -243,7 +243,7 @@ pressed_cb (GtkGesture *gesture,
   GtkWidget *child;
 
   widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
-  child = gtk_widget_pick (widget, x, y);
+  child = gtk_widget_pick (widget, x, y, 0);
 
   if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_SECONDARY)
     {
@@ -320,7 +320,7 @@ released_cb (GtkGesture *gesture,
   GtkWidget *child;
 
   widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
-  child = gtk_widget_pick (widget, x, y);
+  child = gtk_widget_pick (widget, x, y, 0);
 
   if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_PRIMARY)
     {
index dd1bc65151a0cc5993cafdbb519b7aa2cd77c23b..2cba018d276c51212f797d47d6ac295b674d48f3 100644 (file)
@@ -228,7 +228,7 @@ puzzle_button_pressed (GtkGestureMultiPress *gesture,
   int l, t, i;
   int pos;
 
-  child = gtk_widget_pick (grid, x, y);
+  child = gtk_widget_pick (grid, x, y, 0);
 
   if (!child)
     {
index 7eab7923e37c732226ed0cb9c5753712e17bfc60..7f0a178ab8ab1441cb2f4d9c0cc95758167b4703 100644 (file)
@@ -1040,4 +1040,8 @@ typedef enum {
   GTK_PLACES_OPEN_NEW_WINDOW = 1 << 2
 } GtkPlacesOpenFlags;
 
+typedef enum {
+  GTK_PICK_ALL = 1 << 0
+} GtkPickFlags;
+
 #endif /* __GTK_ENUMS_H__ */
index 1cb16836065b561ca47ccc013b061aa86b44e59d..d134da1c699c701ae949515854b4e5ed4d2f7372 100644 (file)
@@ -3928,7 +3928,7 @@ gtk_flow_box_get_child_at_pos (GtkFlowBox *box,
                                gint        x,
                                gint        y)
 {
-  GtkWidget *child = gtk_widget_pick (GTK_WIDGET (box), x, y);
+  GtkWidget *child = gtk_widget_pick (GTK_WIDGET (box), x, y, 0);
 
   if (!child)
     return NULL;
index 2c61209eac321b2df8f357b74543b83bc9fc7d0b..e00cc5949780451ca882014c0a13aa9926d96200 100644 (file)
@@ -1703,7 +1703,7 @@ handle_pointing_event (GdkEvent *event)
       target = gtk_window_lookup_pointer_focus_implicit_grab (toplevel, device, sequence);
 
       if (!target)
-        target = gtk_widget_pick (toplevel_widget, x, y);
+        target = gtk_widget_pick (toplevel_widget, x, y, 0);
 
       if (!target)
         target = toplevel_widget;
@@ -1742,7 +1742,7 @@ handle_pointing_event (GdkEvent *event)
       if (event->any.type == GDK_BUTTON_RELEASE)
         {
           GtkWidget *new_target;
-          new_target = gtk_widget_pick (GTK_WIDGET (toplevel), x, y);
+          new_target = gtk_widget_pick (GTK_WIDGET (toplevel), x, y, 0);
           if (new_target == NULL)
             new_target = GTK_WIDGET (toplevel);
           gtk_synthesize_crossing_events (GTK_ROOT (toplevel), target, new_target, event,
index 6c2c90f455369d1d1b70547c517023dede495d46..cb338a11e8e7bbe21634ea9244912f02fa0b3e91 100644 (file)
@@ -135,7 +135,7 @@ gtk_pointer_focus_repick_target (GtkPointerFocus *focus)
 {
   GtkWidget *target;
 
-  target = gtk_widget_pick (GTK_WIDGET (focus->toplevel), focus->x, focus->y);
+  target = gtk_widget_pick (GTK_WIDGET (focus->toplevel), focus->x, focus->y, 0);
   if (target == NULL)
     target = GTK_WIDGET (focus->toplevel);
   gtk_pointer_focus_set_target (focus, target);
index 586561917e7663061456bf1f5f044e5006ce8eaf..9b430d79c965a1b2e3e4093e7f891da4ff984ce9 100644 (file)
@@ -1865,7 +1865,7 @@ gtk_range_long_press_gesture_pressed (GtkGestureLongPress *gesture,
   GtkRangePrivate *priv = gtk_range_get_instance_private (range);
   GtkWidget *mouse_location;
 
-  mouse_location = gtk_widget_pick (GTK_WIDGET (range), x, y);
+  mouse_location = gtk_widget_pick (GTK_WIDGET (range), x, y, 0);
 
   if (mouse_location == priv->slider_widget && !priv->zoom)
     {
@@ -1909,7 +1909,7 @@ gtk_range_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
                 "gtk-primary-button-warps-slider", &primary_warps,
                 NULL);
 
-  mouse_location = gtk_widget_pick (widget, x, y);
+  mouse_location = gtk_widget_pick (widget, x, y, 0);
 
   /* For the purposes of this function, we ignore fill and highlight and
    * handle them like the trough */
index f309fc7683e6f7a7138e97df3019c7a86f15a781..fafc80c8be97c0f4cd71b429fe556c97a42cce75 100644 (file)
@@ -434,7 +434,7 @@ _gtk_widget_find_at_coords (GdkSurface *surface,
   if (!event_widget)
     return NULL;
 
-  picked_widget = gtk_widget_pick (event_widget, surface_x, surface_y);
+  picked_widget = gtk_widget_pick (event_widget, surface_x, surface_y, 0);
 
   if (picked_widget != NULL)
     gtk_widget_translate_coordinates (event_widget, picked_widget, surface_x, surface_y, widget_x, widget_y);
index 39ac2bd10b42795ce3d79f9dad04acc5cf88a943..f7b2087914a8f714a50ef40febf2d4fdf1fc6f08 100644 (file)
@@ -11006,6 +11006,7 @@ gtk_widget_contains (GtkWidget  *widget,
  * @widget: the widget to query
  * @x: X coordinate to test, relative to @widget's origin
  * @y: Y coordinate to test, relative to @widget's origin
+ * @flags: Flags to influence what is picked
  *
  * Finds the descendant of @widget (including @widget itself) closest
  * to the screen at the point (@x, @y). The point must be given in
@@ -11024,20 +11025,26 @@ gtk_widget_contains (GtkWidget  *widget,
  *     coordinate or %NULL if none.
  **/
 GtkWidget *
-gtk_widget_pick (GtkWidget *widget,
-                 gdouble    x,
-                 gdouble    y)
+gtk_widget_pick (GtkWidget    *widget,
+                 gdouble       x,
+                 gdouble       y,
+                 GtkPickFlags  flags)
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
   GtkWidget *child;
 
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
 
-  if (!gtk_widget_get_can_pick (widget) ||
-      !_gtk_widget_is_sensitive (widget) ||
-      !_gtk_widget_is_drawable (widget))
+  if (!_gtk_widget_is_drawable (widget))
     return NULL;
 
+  if ((flags & GTK_PICK_ALL) == 0)
+    {
+      if (!gtk_widget_get_can_pick (widget) ||
+          !_gtk_widget_is_sensitive (widget))
+        return NULL;
+    }
+
   switch (priv->overflow)
     {
     default:
@@ -11061,7 +11068,7 @@ gtk_widget_pick (GtkWidget *widget,
     {
       GtkWidget *picked;
 
-      picked = gtk_window_pick_popover (GTK_WINDOW (widget), x, y);
+      picked = gtk_window_pick_popover (GTK_WINDOW (widget), x, y, flags);
       if (picked)
         return picked;
     }
@@ -11097,7 +11104,7 @@ gtk_widget_pick (GtkWidget *widget,
 
       graphene_point3d_interpolate (&p0, &p1, p0.z / (p0.z - p1.z), &res);
 
-      picked = gtk_widget_pick (child, res.x, res.y);
+      picked = gtk_widget_pick (child, res.x, res.y, flags);
       if (picked)
         return picked;
     }
index 5424d2182d409d4bf46d937a80bb73a976b2379b..8f0591306b40fdd1a0fa1a88d0e7241d039ccab9 100644 (file)
@@ -751,9 +751,10 @@ gboolean     gtk_widget_contains              (GtkWidget  *widget,
                                                gdouble     x,
                                                gdouble     y);
 GDK_AVAILABLE_IN_ALL
-GtkWidget *  gtk_widget_pick                  (GtkWidget  *widget,
-                                               gdouble     x,
-                                               gdouble     y);
+GtkWidget *  gtk_widget_pick                  (GtkWidget   *widget,
+                                               gdouble      x,
+                                               gdouble      y,
+                                               GtkPickFlags flags);
 
 GDK_AVAILABLE_IN_ALL
 void         gtk_widget_add_controller        (GtkWidget          *widget,
index ab7dc0419aa4bc2a8bb7a709da9ec61a523bc705..ce1ab54dc0958e2f3db3f92f079a7539c601affe 100644 (file)
@@ -736,9 +736,10 @@ static void popover_get_rect (GtkWindowPopover      *popover,
                               cairo_rectangle_int_t *rect);
 
 GtkWidget *
-gtk_window_pick_popover (GtkWindow *window,
-                         double     x,
-                         double     y)
+gtk_window_pick_popover (GtkWindow    *window,
+                         double        x,
+                         double        y,
+                         GtkPickFlags  flags)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
   GList *popovers;
@@ -753,7 +754,7 @@ gtk_window_pick_popover (GtkWindow *window,
                                         x, y,
                                         &dest_x, &dest_y);
 
-      picked = gtk_widget_pick (popover->widget, dest_x, dest_y);
+      picked = gtk_widget_pick (popover->widget, dest_x, dest_y, flags);
       if (picked)
         return picked;
     }
index 67e3973c10ace34f41f68a99bdbeb95dfba555a4..555f5faa6fef7b0d05c10569c790931e21c9645c 100644 (file)
@@ -162,9 +162,10 @@ void             gtk_window_maybe_revoke_implicit_grab (GtkWindow *window,
 void             gtk_window_maybe_update_cursor (GtkWindow *window,
                                                  GtkWidget *widget,
                                                  GdkDevice *device);
-GtkWidget *      gtk_window_pick_popover (GtkWindow *window,
-                                          double     x,
-                                          double     y);
+GtkWidget *      gtk_window_pick_popover (GtkWindow   *window,
+                                          double       x,
+                                          double       y,
+                                          GtkPickFlags flags);
 
 G_END_DECLS
 
index 76e52f4df1cd66319206e9b62cfead483bf53c30..430d3c49e58e1fa0ceabff9feabaf2e63ba1a211 100644 (file)
@@ -55,7 +55,7 @@ find_widget_at_pointer (GdkDevice *device)
       gdk_surface_get_device_position (gtk_widget_get_surface (widget),
                                        device, &x, &y, NULL);
 
-      widget = gtk_widget_pick (widget, x, y);
+      widget = gtk_widget_pick (widget, x, y, 0);
     }
 
   return widget;
index 1dd8d2c1ad84ef75ad7a0109bb6a296386a4a34c..314d72c01d86404db9f8e1c55643f7c87326aac6 100644 (file)
@@ -187,7 +187,7 @@ gtk_transform_tester_snapshot (GtkWidget   *widget,
           const float py = y;
           GtkWidget *picked;
 #if 1
-          picked = gtk_widget_pick (widget, px, py);
+          picked = gtk_widget_pick (widget, px, py, 0);
 #else
           {
             int dx, dy;